#!/bin/bash
#
# Copyright 2009-2014 The VOTCA Development Team (http://www.votca.org)
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

show_help () {
cat <<EOF
${0##*/}, version %version%
This script is a high class wrapper to convert a potential to the generic
3 column tab format used by espresso and espressopp

Usage: ${0##*/} [options] input output

Allowed options:
    --help      show this help
    --clean     remove all intermediate temp files
    --no-shift  do not shift the potential

EOF
}

clean=
do_shift="yes"

### begin parsing options
shopt -s extglob
while [[ ${1#-} != $1 ]]; do
 if [[ ${1#--} = $1 && -n ${1:2} ]]; then
    #short opt with arguments here: o
    if [[ ${1#-[o]} != ${1} ]]; then
       set -- "${1:0:2}" "${1:2}" "${@:2}"
    else
       set -- "${1:0:2}" "-${1:2}" "${@:2}"
    fi
 fi
 case $1 in
   --clean)
    clean="yes"
    shift ;;
   --no-shift)
    do_shift="no"
    shift ;;
   -h | --help)
    show_help
    exit 0;;
  *)
   die "Unknown option '$1'";;
 esac
done

[[ -z $1 || -z $2 ]] && die "${0##*/}: missing argument"
input="$1"
trunc="${1%%.*}"
[[ -f $input ]] || die "${0##*/}: Could not find input file '$input'"
output="$2"
echo "Convert $input to $output"

bondtype="$(csg_get_interaction_property bondtype)"
#[[ $bondtype != non-bonded ]] && die "${0##*/}: conversion of bonded interaction to generic tables is not implemented yet!"

sim_prog="$(csg_get_property cg.inverse.program)"
r_cut=$(csg_get_interaction_property max)
step=$(csg_get_interaction_property step)
r_min=$(csg_get_interaction_property min)
bin_size="$(csg_get_property --allow-empty cg.inverse.$sim_prog.table_bins)"

[[ -z ${bin_size} ]] && bin_size="${step}"

comment="$(get_table_comment)"

case $bondtype in
    angle)
        table_begin=0
        r_cut="3.1415"
        ;;
    dihedral)
        table_begin="-3.1415"
        r_cut="3.1415"
        ;;
    *)
        table_begin="$(csg_get_property --allow-empty cg.inverse.${sim_prog}.table_begin)"
        [[ -z ${table_begin} ]] && table_begin="${r_min}"
        table_end="$(csg_get_property --allow-empty cg.inverse.${sim_prog}.table_end)"
        [[ -z ${table_end} ]] && table_end="${r_cut}"
        ;;
esac

#keep the grid for now, so that extrapolate can calculate the right mean
smooth2="$(critical mktemp ${trunc}.pot.extended.XXXXX)"
critical csg_resample --in ${input} --out "${smooth2}" --grid "${table_begin}:${step}:${table_end}" --comment "$comment"

extrapolate="$(critical mktemp ${trunc}.pot.extrapolated.XXXXX)"
do_external potential extrapolate --type "$bondtype" "${smooth2}" "${extrapolate}"
input="${extrapolate}"

interpol="$(critical mktemp ${trunc}.pot.interpol.XXXXX)"
deriv="$(critical mktemp ${trunc}.pot.deriv.XXXXX)"
critical csg_resample --in "${input}" --out "$interpol" --grid "${table_begin}:${bin_size}:${table_end}" --der "${deriv}" --comment "$comment"
input=${interpol}

smooth="$(critical mktemp ${trunc}.pot.smooth.XXXXX)"
deriv="$(critical mktemp ${trunc}.pot.deriv.XXXXX)"
critical csg_resample --in ${input} --out "${smooth}" --der "${deriv}" --grid "${table_begin}:${bin_size}:${table_end}" --comment "$comment"
input=${smooth}

#enable shift whenever bonded interaction are supported here
if [[ $do_shift = "yes" ]]; then
  tshift="$(critical mktemp ${trunc}.pot.shift.XXXXX)"
  do_external potential shift --type "$bondtype" "${input}" "${tshift}"
  input=${tshift}
fi


do_external convert_potential tab --header "${sim_prog}" --type "${bondtype}" "${input}" "${deriv}" "${output}"

if [[ $clean ]]; then
    rm -f "${smooth}" "${interpol}" "${extrapol}" "${tshift}" "${scale}"
fi
